package expression

import (
	"errors"
	"fmt"
	"gitee.com/huanminabc/go-utils/code_analysis"
	"go-CodeAnalysis/container"
	"go-CodeAnalysis/general"
)

func TokenToVarExpression(index *int, tokens []code_analysis.Token) error {
	//长度必须大于3,因为var name=xxx;至少有4个token
	if len(tokens[*index:]) < 4 {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a var expression", tokens[*index].Line, tokens[*index].ColumnStart, tokens[*index].ColumnEnd))
	}
	//判断类型是否为KEYWORD,值是否为var,如果不是则返回nil ,这种是正常的情况
	if !tokens[*index].IsKeyword && tokens[*index].Value != "var" {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a var", tokens[*index].Line, tokens[*index].ColumnStart, tokens[*index].ColumnEnd))
	}
	//判断下一个token是否为IDENTIFIER,如果不是则返回错误   ,比如:var name=xxx  ,name就是IDENTIFIER
	if tokens[*index+1].Type != code_analysis.IDENTIFIER {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a identifier", tokens[*index+1].Line, tokens[*index+1].ColumnStart, tokens[*index+1].ColumnEnd))
	}
	//判断下一个token是否为OPERATOR,并且值为=,如果不是则返回错误
	if tokens[*index+2].Type != code_analysis.OPERATOR || tokens[*index+2].Value != "=" {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a operator", tokens[*index+2].Line, tokens[*index+2].ColumnStart, tokens[*index+2].ColumnEnd))
	}
	var varName = tokens[*index+1].Value
	// 截取token到;结束
	var newTokens []code_analysis.Token
	for i := *index + 3; i < len(tokens); i++ {
		//如果遇到有字符串那么报错
		if tokens[i].ValueType == code_analysis.STRING {
			return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is a string", tokens[i].Line, tokens[i].ColumnStart, tokens[i].ColumnEnd))
		}
		//如果有遇到字符
		if tokens[i].ValueType == code_analysis.CHAR {
			return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is a character", tokens[i].Line, tokens[i].ColumnStart, tokens[i].ColumnEnd))
		}
		//如果遇到有字符串模板那么报错
		if tokens[i].ValueType == code_analysis.STRING_TEMPLATE {
			return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is a string template", tokens[i].Line, tokens[i].ColumnStart, tokens[i].ColumnEnd))
		}

		if tokens[i].Type == code_analysis.SYMBOL && tokens[i].Value == ";" {
			newTokens = tokens[*index+3 : i]
			*index = i //跳过;
			break
		}
	}

	//将identifier的值取出来,然后替换成constant,这样后面才能计算
	general.IdentifierToConstant(newTokens)
	//计算表达式
	expression := CalculateCore(newTokens)
	//添加全局变量
	container.AddGlobalVariable(varName, expression)
	return nil
}
